package kit4j.ui.cs.swing.dnd;

import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JComponent;
import javax.swing.TransferHandler;

/**
 * JComponent组件的拖拽效果激活器。该类型对象用于方便为没有默认具备支持拖曳姿态的JComponent组件启动拖曳姿态。
 * 
 * @author MiniKnife
 * 
 */
public class JComponentDragDisplayActivator implements MouseMotionListener {
	
	/**
	 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
	 */
	@Override
	public void mouseDragged(MouseEvent evt) {
		int drapMode = getDrapMode(evt);
		JComponent com = (JComponent) evt.getSource();
		TransferHandler handler = com.getTransferHandler();
		
		handler.exportAsDrag(com, evt, drapMode);
	}

	/**
	 * 返回指定鼠标拖曳事件指示的拖曳模式。
	 * 
	 * @param evt
	 *            鼠标拖曳事件对象
	 * @return 拖曳模式
	 */
	protected int getDrapMode(MouseEvent evt) {
		int modifiers = evt.getModifiersEx();
		int ctrlAndShiftModifier = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK;
		
		if ((modifiers & ctrlAndShiftModifier) == InputEvent.CTRL_DOWN_MASK) {
			return TransferHandler.COPY;
		} else if((modifiers & ctrlAndShiftModifier) == ctrlAndShiftModifier) {
			return TransferHandler.LINK;
		} else {
			return TransferHandler.MOVE;
		}
	}

	/**
	 * 无任何操作。
	 * 
	 * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
	 */
	@Override
	public void mouseMoved(MouseEvent evt) {
		// 无操作
	}

}
